/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.type;

/**
 *
 * @author CEABSF
 */
public class CNPJ {
 
    private String numIdentificacao;
    private String numAtividade;
    private String DV;

    public String getDV() {
        return DV;
    }

    public String getNumAtividade() {
        return numAtividade;
    }

    public String getNumIdentificacao() {
        return numIdentificacao;
    }

    public void setDV(String DV) {
        this.DV = DV;
    }

    public void setNumAtividade(String numAtividade) {
        this.numAtividade = numAtividade;
    }

    public void setNumIdentificacao(String numIdentificacao) {
        this.numIdentificacao = numIdentificacao;
    }

    public CNPJ(String numIdentificacao, String numAtividade, String DV) throws Exception {
        this.numIdentificacao = numIdentificacao;
        this.numAtividade = numAtividade;
        this.DV = DV;
        
        if(!CNPJ.isValid(this.numIdentificacao+this.numAtividade+this.DV))
            throw  new Exception("Erro: "+this.numIdentificacao+this.numAtividade+this.DV+" nao esta no formato valido de CNPJ !");
    }
    
    public CNPJ (String cnpj) throws Exception
    {
        cnpj = cnpj.replace(".", "");
        cnpj = cnpj.replace("-", "");
        cnpj = cnpj.replace("/", "");
        
        if(!CNPJ.isValid(cnpj))
            throw  new Exception("Erro: "+this.numIdentificacao+this.numAtividade+this.DV+" nao esta no formato valido de CNPJ !");
 
        this.numIdentificacao = cnpj.substring(0,8);
        this.numAtividade = cnpj.substring(8,12);
        this.DV = cnpj.substring(12,14);
        
    }
            
    static public boolean isValid( String str_cnpj )
    {
       int soma = 0, aux, dig;
       String cnpj_calc = str_cnpj.substring(0,12);
 
       if ( str_cnpj.length() != 14 )
         return false;
 
       char[] chr_cnpj = str_cnpj.toCharArray();
 
       /* Primeira parte */
       for( int i = 0; i < 4; i++ )
         if ( chr_cnpj[i]-48 >=0 && chr_cnpj[i]-48 <=9 )
           soma += (chr_cnpj[i] - 48) * (6 - (i + 1)) ;
       for( int i = 0; i < 8; i++ )
         if ( chr_cnpj[i+4]-48 >=0 && chr_cnpj[i+4]-48 <=9 )
           soma += (chr_cnpj[i+4] - 48) * (10 - (i + 1)) ;
       dig = 11 - (soma % 11);
 
       cnpj_calc += ( dig == 10 || dig == 11 ) ?
                      "0" : Integer.toString(dig);
 
       /* Segunda parte */
       soma = 0;
       for ( int i = 0; i < 5; i++ )
         if ( chr_cnpj[i]-48 >=0 && chr_cnpj[i]-48 <=9 )
           soma += (chr_cnpj[i] - 48) * (7 - (i + 1)) ;
       for ( int i = 0; i < 8; i++ )
         if ( chr_cnpj[i+5]-48 >=0 && chr_cnpj[i+5]-48 <=9 )
           soma += (chr_cnpj[i+5] - 48) * (10 - (i + 1)) ;
       dig = 11 - (soma % 11);
       cnpj_calc += ( dig == 10 || dig == 11 ) ?
                      "0" : Integer.toString(dig);
 
       return str_cnpj.equals(cnpj_calc);
    }
    
    @Override
    public String toString()
    {
        return this.numIdentificacao+"/"+this.numAtividade+"-"+this.DV;
    }
}